package cn.diancan.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpSession;

import cn.diancan.vo.other.VerifyCodeVo;
 

public class VerifyCodeUtil {
	//验证图片的宽度
		private static int width=120;
			//验证图片的高度
		private static int height=40;
			//验证码字符个数
		private static int codeCount=4;
		private static int x=0;
			//字体高度
		private static int fontHeight;
		private static int codeY;
		
		private static	char[] codeSequence={'A', 'B', 'C', 'd', 'E', 'F', 'G', 'H', 'i', 'J',
					'K', 'L', 'M', 'N', 'O', 'P', 'q', 'R', 'S', 'T', 'U', 'V', 'W',
					'X', 'Y', 'Z'};//注意Q和O不好认，所以把Q改成了O
		
		
		/**
		 * 默认
		 * @return
		 * @throws IOException
		 * @throws FontFormatException
		 */
		public static VerifyCodeVo getColorCode() throws IOException, FontFormatException{
			return getColorCode(String.valueOf(width),String.valueOf(height),String.valueOf(codeCount));
		}
		

			/**
			 * @param strWidth 宽度
			 * @param strHeight 高度
			 * @param strCodeCount 字符个数
			 * @throws ServletException
			 * @throws IOException
			 * @throws FontFormatException 
			 */
		public static VerifyCodeVo getColorCode(String strWidth, String strHeight,String strCodeCount) throws IOException, FontFormatException {
			VerifyCodeVo verifyCodeVo=new VerifyCodeVo();
			
				//将配置信息转换成数值
				try{
					if(strWidth!=null&&strWidth.length()!=0){
						width=Integer.parseInt(strWidth);
					}
					if(strHeight!=null&&strHeight.length()!=0){
						height=Integer.parseInt(strHeight);
					}
					if(strCodeCount!=null&strCodeCount.length()!=0){
						codeCount=Integer.parseInt(strCodeCount);
					}
				}catch(NumberFormatException e){
					
				}
				x=width/(codeCount+1);
				fontHeight=height-2;
				codeY=height-4;
				
				//定义图像buffer
				BufferedImage buffImg=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
				Graphics2D g=buffImg.createGraphics();
				//创建一个随机数生成器类
				Random random=new Random();
				//将图像填充为白色
				g.setColor(Color.WHITE);
				g.fillRect(0, 0, width, height);
				
				//创建字体，字体的大小应该根据图片的高度来定
//				InputStream in = ColorCodeController.class.getResourceAsStream(("detourDork.ttf"));
//				Font font = Font.createFont(Font.TRUETYPE_FONT, in);

				Font font=new Font("Verdana",Font.PLAIN,fontHeight);//Verdana
				
				//设置字体
				g.setFont(font);
				
				//画边框
				g.setColor(Color.BLACK);
				g.drawRect(0, 0, width-1, height-1);
				//随机产生30条干扰线，使图像中的认证码不易被其他程序探测到
				g.setColor(Color.BLACK);
				
				for(int i=0;i<30;i++){
					int x=random.nextInt(width);
					int y=random.nextInt(height);
					int x1=random.nextInt(5);
					int y1=random.nextInt(5);
					g.drawLine(x, y, x+x1, y+y1);
				
				}
				//randomCode用于保存随机产生的验证码，以便用户登录后进行验证
				StringBuffer randomCode=new StringBuffer();
				int red=0,green=0,blue=0;
				
				//随机产生codeCount数字的验证码
				for(int i=0;i<codeCount;i++){
					//得到随机产生的验证码数字
					String strRand=String.valueOf(codeSequence[random.nextInt(26)]);
					//产生随机的颜色分量来构造颜色值，这样输出的每位数字的颜色值都将不同
					red=random.nextInt(255);
					green=random.nextInt(255);
					blue=random.nextInt(255);
					
					//用随机产生的颜色将验证码绘制到图像中
					g.setColor(new Color(red,green,blue));
					g.drawString(strRand, (i+1)*x-width/8, codeY);
					//将产生的四个随机数组合在一起。
					randomCode.append(strRand);
					
				} 
				//将四位数字的验证码保存到session中
				 
				verifyCodeVo.setCode(randomCode.toString()); 
				//将图像输出到servlet输出流中 
				ByteArrayOutputStream baos = new ByteArrayOutputStream();  
				ImageIO.write(buffImg, "png", baos);
				baos.flush();  
				byte[] imageInByte = baos.toByteArray();  
				baos.close();
				verifyCodeVo.setImageCode(imageInByte); 
				return verifyCodeVo;
			}
}
